package org.shj.jvm;

/**
 * -server -Xmx10m -Xms10m -XX:+DoEscapeAnalysis -XX:+PrintGC -XX:-UseTLAB
 * -XX:+EliminateAllocations
 * 
 * 利用逃逸技术可使不会逃逸的对象分配在栈上，而不是堆上，当方法调用结束后，可直接清空分配的内存。
 * 而不像在堆中，需要垃圾回收时，才会被清空.
 * 
 * -server : 启用server模式，此模式下，才会启用逃逸分析技术
 * 
 * 下面User对象约占16b的空间，调用1亿次，如果是分配在堆上的话，总共需要约1.5G的空间，但是
 * jvm只设置了10M，从打印的log中，也并未发现Full GC。
 * 
 * 上面是书上讲的，但是在windows下，还是会有[GC (Allocation Failure)] 的log，说明对象
 * 还是分配在堆上的，只不过都是分配在新生代，并且被及时回收了，不会造成内存溢出
 * 
 * @author Administrator
 *
 */
public class OnStackTest {
	public static class User{
		public int id = 0;
		public String name = "";
		private byte[] _1KB = new byte[1*1024];
	}
	
	public static void alloc(){
		User u = new User();
		u.id = 5;
		u.name = "geym";
	}

	public static void main(String[] args) {
		long b = System.currentTimeMillis();
		for(int i = 0; i < 100000000; i++){
			alloc();
		}
		long e = System.currentTimeMillis();
		System.out.println(e-b);

	}

}
